第13章 LangChain搜索功能集成实践
学习目标
- 掌握LangChain搜索集成的核心组件和工作原理
- 学习如何集成Google API、DuckDuckGo和SearXNG三种搜索工具到LangChain中
- 理解如何使用DeepSeek AI模型处理和融合多源搜索结果
- 实现自定义搜索工作流与结果优化策略
LangChain中的搜索组件概述
LangChain提供了丰富的搜索工具集成,让大语言模型能够获取互联网上的实时信息,实现知识增强。
1. 主要搜索工具介绍
我们将重点关注三种常用的搜索工具:
- Google Search API:提供强大的全网索引和精准的搜索结果,但需要API密钥和配额管理
- DuckDuckGo:注重隐私的搜索引擎,无需API密钥,适合快速集成
- SearXNG:开源的元搜索引擎,可自定义和自托管,能够聚合多个搜索引擎的结果
2. 搜索工具的基本配置
# 导入所需的库
from langchain.tools import DuckDuckGoSearchRun
from langchain.tools import GoogleSearchAPIWrapper
from langchain.utilities import SearxSearchWrapper
# 配置DuckDuckGo搜索(无需API密钥)
ddg_search = DuckDuckGoSearchRun()
# 配置Google搜索
import os
os.environ["GOOGLE_CSE_ID"] = "your-cse-id" # 自定义搜索引擎ID
os.environ["GOOGLE_API_KEY"] = "your-api-key" # Google API密钥
google_search = GoogleSearchAPIWrapper()
# 配置SearXNG搜索
searx_search = SearxSearchWrapper(
searx_host="https://your-searxng-instance.com", # SearXNG实例URL
engines=["google", "bing", "duckduckgo"], # 可选择的搜索引擎
num_results=5 # 返回结果数量
)
多搜索引擎集成与性能对比
1. 各搜索引擎特点分析
让我们了解三种搜索引擎的主要特点和适用场景:
搜索引擎 | 优势 | 限制 | 适用场景 |
---|---|---|---|
Google Search | 覆盖面广,结果精准,支持高级过滤 | 需要API密钥和费用,有请求限制 | 需要高质量搜索结果的商业应用 |
DuckDuckGo | 无需API密钥,注重隐私,集成简单 | 结果覆盖面相对较小 | 快速原型开发,注重用户隐私的应用 |
SearXNG | 可自托管,聚合多引擎结果,高度可定制 | 需要自行部署维护,配置较复杂 | 需要自主控制搜索过程的高级应用 |
2. 搜索引擎性能测试
我们可以通过简单的代码比较三种搜索引擎的结果差异:
# 定义测试查询
test_query = "DeepSeek AI最新技术进展"
# 执行多引擎搜索
google_results = google_search.run(test_query)
ddg_results = ddg_search.run(test_query)
searx_results = searx_search.run(test_query)
# 打印结果比较
print("=== Google搜索结果 ===")
print(google_results[:500] + "...") # 截取部分显示
print("\n=== DuckDuckGo搜索结果 ===")
print(ddg_results[:500] + "...")
print("\n=== SearXNG搜索结果 ===")
print(searx_results[:500] + "...")
使用DeepSeek AI模型处理搜索结果
1. DeepSeek模型初始化
from langchain.chat_models import ChatDeepSeek
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# 初始化DeepSeek模型
deepseek_model = ChatDeepSeek(api_key="your-api-key")
2. 搜索结果提取与结构化
使用DeepSeek模型对搜索结果进行处理,提取关键信息:
# 创建结果提取提示模板
extraction_prompt = PromptTemplate(
input_variables=["search_results", "query"],
template="""
从以下搜索结果中提取与查询"{query}"最相关的核心信息。
去除广告、无关内容和重复信息,保留事实性和有价值的内容。
搜索结果:
{search_results}
请以JSON格式输出提取的关键信息:
```json
[
{
"title": "信息标题",
"content": "核心内容摘要",
"relevance": 1-10的相关性评分,
"source": "信息来源"
}
]
""" )
创建提取链
extraction_chain = LLMChain(llm=deepseek_model, prompt=extraction_prompt)
处理搜索结果
def extract_info(search_results, query): return extraction_chain.run(search_results=search_results, query=query)
示例
structured_results = extract_info(ddg_results, test_query) print(structured_results)
## 构建多源融合搜索应用
### 1. 搜索工具封装
将三个搜索引擎封装为LangChain工具:
```python
from langchain.tools import Tool
# 创建搜索工具
tools = [
Tool(
name="Google搜索",
description="使用Google搜索最新信息",
func=google_search.run
),
Tool(
name="DuckDuckGo搜索",
description="使用DuckDuckGo搜索信息,注重隐私",
func=ddg_search.run
),
Tool(
name="SearXNG搜索",
description="使用SearXNG元搜索引擎获取综合结果",
func=searx_search.run
)
]
2. 多源搜索结果融合
创建一个能够融合多个搜索源结果的应用:
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# 创建融合提示词
fusion_prompt = PromptTemplate(
input_variables=["google_results", "ddg_results", "searx_results", "query"],
template="""
你是一个专业的搜索结果分析专家。请基于以下多个搜索引擎的结果,为用户提供全面、客观的信息。
用户查询: {query}
Google搜索结果:
{google_results}
DuckDuckGo搜索结果:
{ddg_results}
SearXNG搜索结果:
{searx_results}
请综合以上信息,提供一个全面且准确的回答。注意:
1. 识别不同来源间的共同点和差异点
2. 优先考虑多个来源共同提到的信息
3. 标注信息的时效性和可靠性
4. 保持客观,区分事实和观点
"""
)
# 创建融合链
fusion_chain = LLMChain(llm=deepseek_model, prompt=fusion_prompt)
# 构建融合搜索函数
def fused_search(query):
# 并行执行多个搜索
google_results = tools[0].func(query)
ddg_results = tools[1].func(query)
searx_results = tools[2].func(query)
# 融合结果
return fusion_chain.run(
google_results=google_results,
ddg_results=ddg_results,
searx_results=searx_results,
query=query
)
# 使用融合搜索
answer = fused_search("量子计算机最新进展")
print(answer)
3. 构建智能搜索代理
使用LangChain代理框架,让AI自主选择合适的搜索工具:
from langchain.agents import initialize_agent, AgentType
# 创建代理
agent = initialize_agent(
tools=tools,
llm=deepseek_model,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 使用代理进行搜索
response = agent.run("请介绍人工智能在医疗诊断领域的最新应用")
print(response)
搜索应用优化策略
1. 查询重写与精确化
使用DeepSeek模型优化原始查询,提高搜索精度:
# 创建查询重写提示词
query_rewrite_prompt = PromptTemplate(
input_variables=["original_query"],
template="""
请将以下用户查询重写为更加精确、清晰的搜索关键词,以便获得更相关的搜索结果。
移除模糊表达,添加具体术语,分解复杂问题为关键点。
原始查询: {original_query}
重写后的搜索关键词(直接输出关键词,不要解释):
"""
)
# 创建查询重写链
query_rewrite_chain = LLMChain(llm=deepseek_model, prompt=query_rewrite_prompt)
# 使用查询重写
original_query = "我想了解那个新出的大语言模型,好像是国内的那个?"
optimized_query = query_rewrite_chain.run(original_query=original_query)
print(f"原始查询: {original_query}")
print(f"优化后查询: {optimized_query}")
# 使用优化后的查询进行搜索
optimized_results = fused_search(optimized_query)
print(optimized_results)
2. 实现自适应搜索策略
根据问题类型自动选择最合适的搜索引擎组合:
# 创建策略选择提示词
strategy_prompt = PromptTemplate(
input_variables=["query"],
template="""
分析以下查询,确定最佳的搜索策略。
查询: {query}
请以JSON格式输出搜索策略:
```json
{
"query_type": "技术/新闻/通用/历史/学术",
"time_sensitivity": "高/中/低",
"recommended_engines": ["引擎1", "引擎2"],
"priority_engine": "主要推荐引擎"
}
""" )
创建策略选择链
strategy_chain = LLMChain(llm=deepseek_model, prompt=strategy_prompt)
自适应搜索函数
def adaptive_search(query): # 分析查询类型 strategy = strategy_chain.run(query=query)
# 解析返回的JSON(实际应用中需要处理异常)
import json
strategy_dict = json.loads(strategy)
# 根据策略选择搜索引擎
results = {}
if "Google" in strategy_dict["recommended_engines"]:
results["google"] = tools[0].func(query)
if "DuckDuckGo" in strategy_dict["recommended_engines"]:
results["ddg"] = tools[1].func(query)
if "SearXNG" in strategy_dict["recommended_engines"]:
results["searx"] = tools[2].func(query)
# 将结果传给融合链
# 这里需要根据实际结果调整输入参数
fusion_input = {
"query": query,
"google_results": results.get("google", "未使用Google搜索"),
"ddg_results": results.get("ddg", "未使用DuckDuckGo搜索"),
"searx_results": results.get("searx", "未使用SearXNG搜索")
}
return fusion_chain.run(**fusion_input)
使用自适应搜索
result = adaptive_search("2023年突破性AI技术有哪些?") print(result)
## 构建实用搜索应用: AI研究助手
结合前面所学,构建一个实用的AI研究助手:
```python
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
# 创建带记忆的研究助手提示词
research_assistant_prompt = PromptTemplate(
input_variables=["history", "input"],
template="""
你是一位专业的AI研究助手,能够帮助用户研究任何主题。你有以下功能:
1. 分析用户的研究问题
2. 使用多个搜索引擎获取最新信息
3. 整合和综合信息,提供深入的分析
4. 跟踪研究上下文,并在多轮对话中保持连贯性
聊天历史:
{history}
用户问题: {input}
请先思考用户问题的本质和所需信息类型,再决定如何回应。如果需要搜索,请明确说明你将搜索什么内容。
"""
)
# 创建研究助手对话链
memory = ConversationBufferMemory()
research_chain = ConversationChain(
llm=deepseek_model,
prompt=research_assistant_prompt,
memory=memory,
verbose=True
)
# 创建搜索增强的研究助手函数
def research_assistant(query):
# 分析是否需要搜索
if "最新" in query or "进展" in query or "新闻" in query or "近期" in query:
# 执行搜索
search_results = fused_search(query)
# 构造带有搜索结果的新查询
enhanced_query = f"""
原始问题: {query}
我已经为你搜索了相关信息,结果如下:
{search_results}
请基于上述信息回答原始问题。
"""
return research_chain.predict(input=enhanced_query)
else:
# 不需要搜索,直接使用模型知识回答
return research_chain.predict(input=query)
# 使用研究助手
queries = [
"DeepSeek AI最近有什么突破?",
"这些突破对自然语言处理有什么影响?",
"与其他大语言模型相比有什么优势?"
]
for query in queries:
print(f"\n用户: {query}")
response = research_assistant(query)
print(f"AI助手: {response}")
思考题
如何评估多源搜索融合的效果?你会设计什么指标来衡量搜索结果的质量和相关性?
在什么场景下,GoogleAPI、DuckDuckGo和SearXNG各自具有明显优势?如何根据应用需求选择最合适的搜索工具?
如何处理多源搜索结果中的矛盾信息?DeepSeek模型在处理这类冲突时应采取什么策略?
试设计一个改进版的多源融合算法,能够自动评估不同搜索源的可靠性,并据此调整各源结果的权重。
如何在保持搜索结果准确性的同时,优化API调用成本和系统响应时间?
接下来,我们将学习如何将LangChain与向量数据库结合,构建更强大的知识检索系统。